#!/usr/bin/env python3
"""
优化的MySQL数据库初始化脚本
问题表 + 测试用例表 + 测试用例集合表（中间表设计）
消除冗余，建立清晰的多对多关系
"""

import pymysql
import sys
sys.path.append('src')
from database_config import DatabaseConfig

def create_database():
    """创建MySQL数据库"""
    config = DatabaseConfig.get_config()
    database_name = config['database']
    
    print(f"正在连接到MySQL服务器...")
    print(f"   主机: {config['host']}:{config['port']}")
    print(f"   用户: {config['user']}")
    print(f"   数据库: {database_name}")
    
    try:
        # 连接到MySQL服务器（不指定数据库）
        conn_config = config.copy()
        conn_config.pop('database')
        conn = pymysql.connect(**conn_config)
        cursor = conn.cursor()
        
        # 创建数据库
        cursor.execute(f"CREATE DATABASE IF NOT EXISTS {database_name} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")
        print(f"数据库 '{database_name}' 创建成功")
        
        # 选择数据库
        cursor.execute(f"USE {database_name}")
        
        # 1. 创建问题表（核心表）
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS problems (
                id INT AUTO_INCREMENT PRIMARY KEY,
                description TEXT NOT NULL COMMENT '问题描述',
                input_format TEXT COMMENT '输入格式',
                output_format TEXT COMMENT '输出格式',
                problem_type VARCHAR(50) DEFAULT 'unknown' COMMENT '问题类型',
                created_by VARCHAR(50) DEFAULT 'teacher' COMMENT '创建者',
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                is_active BOOLEAN DEFAULT TRUE COMMENT '是否激活'
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='问题表'
        ''')
        
        # 2. 创建测试用例表（纯测试用例信息，不包含问题信息）
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS test_cases (
                id INT AUTO_INCREMENT PRIMARY KEY,
                title VARCHAR(255) COMMENT '测试用例标题',
                description TEXT COMMENT '测试用例描述',
                input_data JSON NOT NULL COMMENT '输入数据',
                expected_output JSON NOT NULL COMMENT '期望输出',
                test_type VARCHAR(50) COMMENT '测试类型',
                created_by VARCHAR(100) DEFAULT 'teacher' COMMENT '创建者',
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                tags JSON COMMENT '标签',
                difficulty VARCHAR(20) DEFAULT 'medium' COMMENT '难度等级',
                is_active BOOLEAN DEFAULT TRUE COMMENT '是否激活',
                INDEX idx_test_type (test_type),
                INDEX idx_created_by (created_by),
                INDEX idx_difficulty (difficulty)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='测试用例表'
        ''')
        
        # 3. 创建测试用例集合表（中间表，只存储关联关系）
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS test_case_sets (
                id INT AUTO_INCREMENT PRIMARY KEY,
                problem_id INT NOT NULL COMMENT '关联的问题ID',
                test_case_id INT NOT NULL COMMENT '关联的测试用例ID',
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                FOREIGN KEY (problem_id) REFERENCES problems(id) ON DELETE CASCADE,
                FOREIGN KEY (test_case_id) REFERENCES test_cases(id) ON DELETE CASCADE,
                UNIQUE KEY unique_problem_test_case (problem_id, test_case_id),
                INDEX idx_problem_id (problem_id),
                INDEX idx_test_case_id (test_case_id)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='测试用例集合表（中间表）'
        ''')
        
        # 4. 创建用户表（教师认证系统）
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS users (
                id INT AUTO_INCREMENT PRIMARY KEY,
                username VARCHAR(50) UNIQUE NOT NULL COMMENT '用户名',
                password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希',
                real_name VARCHAR(100) NOT NULL COMMENT '真实姓名',
                email VARCHAR(100) COMMENT '邮箱',
                role VARCHAR(20) DEFAULT 'teacher' COMMENT '角色',
                is_active BOOLEAN DEFAULT TRUE COMMENT '是否激活',
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
                last_login DATETIME COMMENT '最后登录时间',
                INDEX idx_username (username),
                INDEX idx_role (role)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'
        ''')
        
        conn.commit()
        print("表创建成功")
        
        # 显示表结构
        cursor.execute("SHOW TABLES")
        tables = cursor.fetchall()
        print(f"数据库中的表: {[table[0] for table in tables]}")
        
        # 显示表结构详情
        for table_name in ['problems', 'test_cases', 'test_case_sets', 'users']:
            print(f"\n{table_name} 表结构:")
            cursor.execute(f"DESCRIBE {table_name}")
            columns = cursor.fetchall()
            for column in columns:
                print(f"  {column[0]}: {column[1]} {column[2] if column[2] else ''}")
        
        # 创建默认管理员账号
        print("\n正在创建默认管理员账号...")
        try:
            import hashlib
            admin_password = "admin123"
            password_hash = hashlib.sha256(admin_password.encode()).hexdigest()
            
            cursor.execute('''
                INSERT IGNORE INTO users (username, password_hash, real_name, role)
                VALUES (%s, %s, %s, %s)
            ''', ("admin", password_hash, "系统管理员", "admin"))
            
            conn.commit()
            print("默认管理员账号创建成功:")
            print("  用户名: admin")
            print("  密码: admin123")
            print("  请首次登录后立即修改密码！")
        except Exception as e:
            print(f"创建默认管理员账号失败: {e}")
        
        conn.close()
        print("\nMySQL数据库初始化完成")
        
    except Exception as e:
        conn.rollback()
        print(f"创建数据库时出错: {e}")
        print("请确保:")
        print("1. MySQL服务正在运行")
        print("2. 数据库用户有创建数据库的权限")
        print("3. 数据库配置正确")
        raise e

if __name__ == "__main__":
    print("MySQL数据库初始化脚本")
    print("=" * 50)
    create_database()
